package lombok.demo;

import lombok.*;

/**
 * {@code @NoArgsConstructor}：生成一个无参构造器<p>
 * {@code @AllArgsConstructor}：生成一个全参构造器<p>
 * {@code @RequiredArgsConstructor}：生成一个具有必须参数的构造器。必须参数指的是final字段和例如标注了 @NotNull 这种约束的字段。
 * 在没有这种类型的字段时与 @NoArgsConstructor 无异。<p>
 * <p>
 * 属性解析: <p>
 * staticName: 是否使用静态构造函数取代生成的构造函数，默认为""，表示 生成普通的构造函数 。如果指定静态构造函数名称，则创建一个静态工厂方法，其他类可以使用该方法创建实例，并将构造函数私有化。
 * access: 设置生成的构造函数的访问等级，默认是PUBLIC。如果跟staticName一起用则影响的对象是工厂方法。
 *
 * @author yexi
 */
@NoArgsConstructor(staticName = "noArg", access = AccessLevel.PUBLIC)
@AllArgsConstructor(staticName = "allArg", access = AccessLevel.PUBLIC)
public class ConstructorDemo extends SuperClass {

    private static int staticValue;

    private int age;

    private char sex;

    private boolean high;

    private float money;

    /**
     * 将 @RequiredArgsConstructor 特地抽出来，这样生成包含final字段构造器的效果才能显现(否则冲突)
     */
    @RequiredArgsConstructor(staticName = "requiredArg", access = AccessLevel.PUBLIC)
    public static class Son extends ConstructorDemo {

        private final int height;
        private @NonNull Object wife;

    }
}
